Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Remote Method Invocation</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Remote_Method_Invocation"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Remote_Method_Invocation rootpage-Remote_Method_Invocation skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Remote Method Invocation</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p><b>Remote Method Invocation</b> (<b>RMI</b>, deutsch etwa „Aufruf entfernter Methoden“), gelegentlich auch als <b>Methodenfernaufruf</b> bezeichnet, ist der Aufruf einer <a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">Methode</a> eines entfernten <a href="Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a>-<a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">Objekts</a> und realisiert die Java-eigene Art des <a href="Remote_Procedure_Call" title="Remote Procedure Call">Remote Procedure Call</a>. „Entfernt“ bedeutet dabei, dass sich das Objekt in einer anderen <i><a href="Java_Virtual_Machine" title="Java Virtual Machine">Java Virtual Machine</a></i> befinden kann, die ihrerseits auf einem entfernten Rechner oder auf dem lokalen Rechner laufen kann. Dabei sieht der Aufruf für das aufrufende Objekt (bzw. dessen Programmierer) genauso aus wie ein lokaler Aufruf, es müssen jedoch besondere <a href="Ausnahmebehandlung" title="Ausnahmebehandlung">Ausnahmen</a> (<i>Exceptions</i>) abgefangen werden, die zum Beispiel einen Verbindungsabbruch signalisieren können.
</p><p>Auf der <a href="Client" title="Client">Client</a>-Seite kümmert sich der sogenannte <i><a href="Stub_(Programmierung)" title="Stub (Programmierung)">Stub</a></i> um den Netzwerktransport. Der <i>Stub</i> muss entweder lokal oder über das Netz für den Client verfügbar sein. Vor dem Erscheinen der <i><a href="Java_Platform%2C_Standard_Edition" title="Java Platform, Standard Edition">Java 2 Standard Edition</a></i> (J2SE) in Version 1.5.0 war der <i>Stub</i> eine mit dem RMI-Compiler <span style="font-family:monospace;">rmic</span> erzeugte Klasse. Ab der Version 1.5 ist es nicht mehr notwendig, den RMI-Compiler <span style="font-family:monospace;">rmic</span> aufzurufen. Das Erstellen des <i>Stubs</i> wird von der <i>Java Virtual Machine</i> übernommen.
</p><p>Entfernte Objekte können zwar auch von einem bereits im Programm bekannten entfernten Objekt bereitgestellt werden, für die erste Verbindungsaufnahme werden aber die Adresse des Servers und ein Bezeichner (ein RMI-URL) benötigt. Für den Bezeichner liefert ein Namensdienst auf dem Server eine Referenz auf das entfernte Objekt zurück. Damit dies funktioniert, muss sich das entfernte Objekt im Server zuvor unter diesem Namen beim Namensdienst registriert haben. Der RMI-Namensdienst wird über statische Methoden der Klasse <code>java.rmi.Naming</code> angesprochen. Der Namensdienst ist als eigenständiges Programm implementiert und wird <i>RMI Registry</i> genannt.
</p>

<div class="mw-heading mw-heading2"><h2 id="Kommunikationsprotokoll">Kommunikationsprotokoll</h2></div>
<p><i>RMI</i> bezeichnet außerdem ein auf TCP/IP und JRMP basierendes <a href="Kommunikationsprotokoll" title="Kommunikationsprotokoll">Kommunikationsprotokoll</a>, das für entfernte Aufrufe zwischen Java-Objekten verwendet wird, und eine Java-Standard-<a href="Klassenbibliothek" class="mw-redirect" title="Klassenbibliothek">Klassenbibliothek</a>, mit der diese Aufrufe realisiert werden können. Diese Klassenbibliothek ist Teil der <i><a href="Java_Platform%2C_Standard_Edition" title="Java Platform, Standard Edition">J2SE</a></i>. Alternativ kann auch <a href="IIOP" title="IIOP">IIOP</a> als Kommunikationsprotokoll eingesetzt werden. Für RMI sind zwei <a href="Port_(Netzwerkadresse)" title="Port (Netzwerkadresse)">Ports</a> reserviert. Port 1099 ist für die RMI-Registry reserviert, also den Namensdienst. Port 1098 ist für den <i>Activator</i> reserviert.
</p>
<div class="mw-heading mw-heading2"><h2 id="Komponenten">Komponenten</h2></div>
<dl><dt>Remote Interface</dt>
<dd>ist ein Subinterface von java.rmi.Remote und beschreibt die Funktionen, die auf dem Server zur Verfügung stehen. Damit definiert es das Verhalten des entfernten Objekts (ohne dieses zu implementieren). Jede abstrakte Methode des Remote Interfaces muss in ihrer throws-Klausel eine RemoteException deklarieren<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.</dd>
<dt>Remote Object</dt>
<dd>stellt das entfernte Objekt dar und liegt auf dem Server. Es implementiert das Remote Interface und das Verhalten der für die Clients zur Verfügung stehenden entfernten Methoden. Vom Server können eine oder mehrere Instanzen des Remote-Objekts erstellt werden. Ein Remote Object muss von UnicastRemoteObject abgeleitet sein. Es muss mindestens ein Konstruktor zur Verfügung gestellt werden, der in seiner throws-Klausel eine geprüfte Ausnahme vom Typ RemoteException deklariert, da der parameterlose Konstruktor von UnicastRemoteObject in seiner throws-Klausel diese geprüfte Ausnahme ebenfalls deklariert. Das Remote Object kann Methoden implementieren, die nicht im Remote Interface auftauchen – diese können dann aber nur lokal aufgerufen werden<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>.</dd>
<dt>Remote Reference</dt>
<dd>ist eine Referenz auf Remote Objects. Die Clients bekommen die Remote Reference von der RMI Registry.</dd></dl>
<div class="mw-heading mw-heading2"><h2 id="Ablauf">Ablauf</h2></div>

<ol><li>Der Server registriert ein <i>Remote Object</i> bei der RMI-Registry unter einem eindeutigen Namen.</li>
<li>Der Client sieht bei der RMI-Registry unter diesem Namen nach und bekommt eine Objektreferenz, die seinem <i>Remote Interface</i> entsprechen muss.</li>
<li>Der Client ruft eine Methode aus der Objektreferenz auf (dass diese Methode existiert, wird durch das <i>Remote Interface</i> garantiert). Dabei kann ein Objekt einer Klasse X übergeben werden, die der JVM des Servers bisher nicht bekannt ist (das ist möglich, wenn X ein dem Server bekanntes Interface implementiert). In diesem Fall lädt die Server-JVM die Klasse X dynamisch nach, beispielsweise vom Webserver des Client.</li>
<li>Die Server-JVM führt die Methode auf dem <i>Remote Object</i> aus, wobei evtl. dynamisch geladener Fremdcode benutzt wird (z.&nbsp;B. Methoden von X), der im Allgemeinen Sicherheitsrestriktionen unterliegt. Dem Client werden die Rückgabewerte dieses Aufrufes gesendet, oder der Client bekommt eine Fehlermeldung (z.&nbsp;B. bei einem Verbindungsabbruch).</li></ol>
<div class="mw-heading mw-heading2"><h2 id="Activation">Activation</h2></div>
<p>Als Ergänzung von RMI steht die sogenannte <i>Activation</i> („Aktivierung“) zur Verfügung. Ähnlich der RMI-Registry ist auch dies eine zentrale Anlaufstelle für RMI-Clients. Jedoch kann der <i>Activator</i> auch RMI-Server-Objekte erzeugen und neue <a href="Java_Virtual_Machine" title="Java Virtual Machine">Virtuelle Maschinen</a> starten.
</p>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<ul><li><a href="Jini" title="Jini">Jini</a></li>
<li><a href="Java_Naming_and_Directory_Interface" title="Java Naming and Directory Interface">Java Naming and Directory Interface</a> (JNDI)</li>
<li><a href="Cajo" title="Cajo">Cajo</a> (Vereinfachung des Gebrauchs von RMI)</li>
<li><a href="SIMON" title="SIMON">SIMON</a> (Alternative zu RMI)</li>
<li><a href="Common_Object_Request_Broker_Architecture" title="Common Object Request Broker Architecture">Common Object Request Broker Architecture</a> (CORBA)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136424.html">Java Remote Method Invocation</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://www.sbgl.de/rmi/">Funktionsweise und Ziele von RMI</a></li>
<li><a rel="nofollow" class="external autonumber" href="https://docs.oracle.com/en/java/javase/21/docs/specs/rmi/objmodel.html#implementing-a-remote-interface">[1]</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://docs.oracle.com/en/java/javase/21/docs/specs/rmi/objmodel.html#overview-of-rmi-interfaces-and-classes">2.4.1 The java.rmi.Remote Interface, abgerufen am 27. Februar 2024</a></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://docs.oracle.com/en/java/javase/21/docs/specs/rmi/objmodel.html#implementing-a-remote-interface">2.5 Implementing a Remote Interface, abgerufen am 27. Februar 2024</a></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2024-03-20" href="https://de.wikipedia.org/wiki/?title=Remote_Method_Invocation&amp;oldid=243297061">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>